//
// @Auther: by wujehy 
// @Email:wujehy@qq.com
// @Data:20-3-16
// @Time:下午2:04
//

#ifndef LISTERNERTEST_SINGLETONOBJECT_H
#define LISTERNERTEST_SINGLETONOBJECT_H
#include<iostream>
#include <map>
/**
 * @brief 这是一个单例 对象
 */
class SingletonObject {
public:
    // 获取单例的 方法
    static SingletonObject* getInstance()
    {
        // 这里的操作是 声明一个全局对象 static 标志
        // 因为是static 所以 每次定义都是同一个 对象
        static SingletonObject obj;

//        printf("SingletonObject *obj = %lld" , &obj);
        std::cout<<"SingletonObject *obj ="<<&obj<<std::endl;
        // 然后获取他的指针
        return &obj;
    }

    // 析钩器 可公开
    ~SingletonObject();

    // 重载 = 号 传递 信息
    SingletonObject(const SingletonObject &);

    // 成员传递
    SingletonObject &operator=(const SingletonObject &s)
    {
        // 一个单例 = 另一个单例的时候 传递 名称 和map
        std::cout<<" init get SingletonObject by name = "<<s.singletonname<<std::endl;
        this->singletonname=s.singletonname;
        this->userMap=s.userMap;
    }
    /**
     * @brief 保存一个用户 信息
     * @param username 用户名
     * @param data 数据字符串
     * @return 成功 或 失败
     */
    bool saveUserdata(std::string username, std::string data);

    /**
     * @brief 获取这个用户的信息
     * @param username 需要查询的用户
     * @return 返回数据
     */
    std::string getUserData(std::string username) const ;

    /**
     * @brief 删除这个用户 的信息
     * @param username  用户名
     * @return 成功 或 失败
     */
    bool deleteUserData(std::string username);
private:
    // 构造器 只能通过 单例 获得 不能 公开
    SingletonObject();

    // 储存用户信息的 map;
    std::map<std::string,std::string> userMap;

    std::string singletonname;
public:
    const std::string &getSingletonname() const;

public:
    void setSingletonname(const std::string &singletonname);
};


#endif //LISTERNERTEST_SINGLETONOBJECT_H
